#pragma once

#include <vector>
#include <set>
#include <map>
#include <string>

class Function;
class Instruction;

/// 活跃变量分析器
class LivenessAnalysis {
public:
    // 对函数进行活跃变量分析
    void analyze(Function * func);

    // 获取某条指令的活跃变量集合（in集合）
    const std::set<std::string> & getInSet(Instruction * inst) const;

    // 输出每条指令的活跃变量集合
    void printLiveness(Function * func) const;

    // 获取所有变量的活跃区间（变量名 -> [start, end] 指令下标）
    std::map<std::string, std::pair<int, int>> getLiveIntervals(Function * func) const;

private:
    // 指令到in集合的映射
    std::map<Instruction *, std::set<std::string>> inSets;
    // 指令到out集合的映射
    std::map<Instruction *, std::set<std::string>> outSets;
};
